package br.com.sigad.servico;

import java.math.BigDecimal;
import java.sql.Connection;
import java.util.List;

import br.com.sigad.dao.AssociadoDAO;
import br.com.sigad.dao.ConnectionFactory;
import br.com.sigad.dao.DependenteDAO;
import br.com.sigad.dto.AssociadoDTO;
import br.com.sigad.dto.DependenteDTO;

public class AssociadoService extends Service{

	public void gravarAssoc(AssociadoDTO associado) throws Exception {
		Connection conn = null;
		try{
			BigDecimal numeroAssociado = null;
			conn = ConnectionFactory.getConnection();
			AssociadoDAO dao = new AssociadoDAO();
			numeroAssociado = dao.gravar(associado,conn);
			if(associado.getDependentes().size() > 0){
				DependenteDAO daoDep = new DependenteDAO();
				for(DependenteDTO dep : associado.getDependentes()){
					dep.setNuAssociado(numeroAssociado);
					daoDep.gravar(dep, conn);
				}
			}
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}

	public void alterarAssoc(AssociadoDTO associado) throws Exception {
		Connection conn = null;
		try{
			conn = ConnectionFactory.getConnection();
			DependenteDAO daoDep = new DependenteDAO();
			DependenteDTO dep = new DependenteDTO();
			dep.setNuAssociado(associado.getNuAssociado());
			daoDep.excluirTodos(dep, conn);
			AssociadoDAO dao = new AssociadoDAO();
			dao.alterar(associado,conn);
			for(DependenteDTO dep2 : associado.getDependentes()){
				dep2.setNuAssociado(associado.getNuAssociado());
				daoDep.gravar(dep2, conn);
			}
			conn.commit();
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}

	public void excluirAssoc(AssociadoDTO associado) throws Exception {
		Connection conn = null;
		try{
			conn = ConnectionFactory.getConnection();
			DependenteDAO depDao = new DependenteDAO();
			DependenteDTO dep = new DependenteDTO();
			depDao.excluirTodos(dep, conn);
			AssociadoDAO dao = new AssociadoDAO();
			dao.excluir(associado,conn);
			conn.commit();
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}
	
	public List<AssociadoDTO> pesquisarAssoc(AssociadoDTO associado) throws Exception{
		Connection conn = null;
		try{
			conn = ConnectionFactory.getConnection();
			AssociadoDAO dao = new AssociadoDAO();
			return dao.pesquisar(associado, conn);
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}
	
	public List<AssociadoDTO> pesquisarAssocAposentado() throws Exception{
		Connection conn = null;
		try{
			conn = ConnectionFactory.getConnection();
			AssociadoDAO dao = new AssociadoDAO();
			return dao.pesquisarTodosAposentados(conn);
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}

	public List<AssociadoDTO> verificaDuplicidade(AssociadoDTO socio) {
		Connection conn = null;
		try{
			conn = ConnectionFactory.getConnection();
			AssociadoDAO dao = new AssociadoDAO();
			return dao.verificaDuplicidade(conn, socio);
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			fecharConexao(conn);
		}
	}

	public List<DependenteDTO> recuperarDependentes(AssociadoDTO associado) {
		Connection conn = null;
		try {
			conn = ConnectionFactory.getConnection();
			DependenteDAO dao = new DependenteDAO();
			DependenteDTO dep = new DependenteDTO();
			dep.setNuAssociado(associado.getNuAssociado());
			return dao.pesquisar(dep, conn);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}